package com.servicecloud.provider.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.servicecloud.entities.Dept;
import com.servicecloud.provider.service.DeptService;

@RestController
//@DefaultProperties(defaultFallback = "defaultFallback")使用该注解后如果服务出现错误熔断的时候会自动调用一个defaultFallback的方法
public class DeptController {
	@Autowired
	private DeptService service;

	@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
	// 一旦调用服务方法失败或者自身抛出了错误信息后，会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法进行服务降级处理
	 @HystrixCommand(commandKey="hystrix_self_key") //如果不写fallbackMethod默认会调用defaultFallback,hystrix_self_key是自定义的一个key，便于在配置文件properties里面定位到该方法，默认为方法名字作为key
//	@HystrixCommand(fallbackMethod = "processHystrix_Get",commandProperties= {
//			@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000"),//设置超时时间，默认是一秒,这些配置可以配置到配置文件里面
//	})
//	@HystrixCommand( commandProperties = { // 服务熔断
//			@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//设置熔断，开启断路器，相当于保险丝
//			@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),//断路器的最小请求数
//			@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),//休眠时间窗到时间后会设置为half_open状态，这是如果请求还是失败那么
//			//会继续保持open状态，如果成功就设置为close状态
//			@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") })//设置断路器错误百分比，意思就是说如果请求了10次，其中有7次都是失败
		//，此时超过了60%，就继续保持断路器open状态
	public Dept get(@PathVariable("id") Long id) {

		Dept dept = this.service.get(id);

		if (null == dept) {
			throw new RuntimeException("该ID：" + id + "没有没有对应的信息");
		}

		return dept;
	}

	/**
	 * 
	 * @Description<br>
	 * 					服务熔断处理，配置在服务端，注意与服务降级（配置在客户端）的区别
	 * 
	 *                  <pre>
	 *	 {@code
	 *		
	 *	 }
	 *                  </pre>
	 * 
	 * @Author Gavin</br>
	 *         2019年8月16日
	 */
	public Dept processHystrix_Get(@PathVariable("id") Long id) {// 参数要和上面的方法保持一致
		return new Dept().setDeptno(id).setDname("该ID：" + id + "没有没有对应的信息,null--@HystrixCommand")
				.setDb_source("no this database in MySQL");
	}

	public String defaultFallback() {
		return "默认提示：前方道路太拥挤了。";
	}
}
